package tests.read;

import static org.junit.Assert.*;

import java.net.UnknownHostException;
import java.util.ArrayList;

import model.Budget;
import model.BudgetFactory;

import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.workplicity.util.Helper;
import org.workplicity.worklet.WorkletContext;

import com.mongodb.BasicDBObject;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.Mongo;
import com.mongodb.MongoException;
import com.mongodb.util.JSON;

public class BudgetQueryTest01
{
	Budget budget;
	BudgetFactory factory;

	@BeforeClass
	public static void setUpBeforeClass() throws Exception
	{
	}

	@AfterClass
	public static void tearDownAfterClass() throws Exception
	{
	}

	@Before
	public void setUp() throws Exception
	{
		factory = new BudgetFactory();
		budget = (Budget) factory.create();
        budget.setName("Test budget");
        budget.setDescription("This is a test budget.");
        budget.commit();
	}

	@After
	public void tearDown() throws Exception
	{
		Mongo mongo = null;
  		try
  		{
  			mongo = new Mongo();
  		} catch (UnknownHostException e)
  		{
  			// TODO Auto-generated catch block
  			e.printStackTrace();
  		} catch (MongoException e)
  		{
  			// TODO Auto-generated catch block
  			e.printStackTrace();
  		}
  		
          DB db = mongo.getDB("cc");
          DBCollection collection = db.getCollection(budget.getRepositoryName());
          collection.remove(new BasicDBObject("entry.id", budget.getId()));
	}

	@SuppressWarnings("unchecked")
	@Test
	public void test()
	{
		BasicDBObject pred = new BasicDBObject("budget.description", "This is a test budget");
		String criteria = JSON.serialize(pred);
		ArrayList<Budget> budgets = Helper.query(criteria, WorkletContext.getInstance());
		try{
			for(Budget b : budgets){
				if(!b.getDescription().equals("This is a test budget"));
					fail("Querying by description failed");
			}
					
			
		}
		catch (Exception e){
			fail("Fetching budget by description failed with exception " + e);
		}
	}

}
